
#ifndef _LISTECARTE_H
#define _LISTECARTE_H

/**
 * @file listeCarte.h
 * @brief Contient les structures Cellule et Pioche
 * @details liste des fonctions pour le module listeCarte
 * @version 1.0
 * @date 2013/05/16
*/
#include "carte.h"
#include "lireFichier.h"
/**
* @struct Cellule structure cellule
* @brief Stucture Cellule
* @details contient un tableau de Carte comme contenu ,deux pointeurs sur la Cellule suivante et la precedente.
*/
struct sCellule
{
	Carte * contenu;
    struct sCellule * suivant;
    struct sCellule * preced;
};
typedef struct sCellule Cellule;

/**
* @struct Pioche structure pioche
* @brief Structure Pioche
* @details  contient deux pointeur sur Cellule ,pour le debut et la fin de Pioche .
*/

typedef struct
{
	Cellule * debut;
	Cellule * fin;
}
  Pioche;
/**
* @fn creerPioche()
* @brief alloue une Pioche et fais appel a initPioche
* @param void
* @return Pioche * pointeur sur Pioche
*/
Pioche * creerPioche();
/**
* @fn initPioche(Pioche *)
* @brief initialise les pointeur debut et fin à NULL.
* @param [in-out] Pioche * pointeur sur la Pioche.
*/
void initPioche(Pioche *);
/**
* @fn creerCellule()
* @brief alloue une Cellule et fais appel a initCellule.
* @param void
* @return Cellule * pointeur sur Cellule.
*/
Cellule * creerCellule();
/**
* @fn initCellule(Cellule *)
* @brief initialise les pointeur suivant et preced à NULL et fais appel a creerCarte pour contenu.
* @param [in-out] Cellule * pointeur sur Cellule.
*/
void initCellule(Cellule *);
/**
* @fn testamentPioche(Pioche *)
* @brief fais appel a detruireCellule jusqu'a ce que la pioche soit vide .
* @param [in] Pioche * pointeur sur Pioche
*/
void liberePioche(Pioche *);
/**
* @fn detruirePioche(Pioche **)
* @brief fais appel a testamentPioche et met le pointeur a NULL.
* @param [in-out] Pioche** pointeur sur pointeur sur Pioche.
*/
void detruitPioche(Pioche **);
/**
* @fn libereCellule(Cellule *)
* @brief fais appel a detruireCarte et met les pointeur suivant et preced a NULL.
* @param [in-out] Cellule * pointeur sur Cellule.
*/
void libereCellule(Cellule *);
/**
* @fn detruireCellule(Cellule **)
* @brief fais appel a libereCellule et met le pointeur a NULL.
* @param [in-out] Cellule** pointeur sur pointeur sur Cellule
*/
void detruitCellule(Cellule **);


/**
* @fn enfilerCarte(Pioche *, const Carte *)
* @brief Ajoute une carte à la pioche
* @param [in-out] Pioche * pointeur sur Pioche.
* @param [in] Carte * pointeur sur Carte.
*/
void enfilerCarte(Pioche *, Carte *);
/**
* @fn defilerRenfilerCarte(Pioche *)
* @brief Remet la 1ère carte en dessous de la pioche
* @param [in-out] Pioche * pointeur sur Pioche.
*/
void defilerRenfilerCarte(Pioche *);
/**
* @fn retourneTetePioche(const Pioche *)
* @brief Retourne la 1ère carte
* @param [in] Pioche * pointeur sur Pioche.
*/
Carte * retourneTetePioche(const Pioche *);
/**
* @fn remplirPiocheListeTC(Pioche *, const char *)
* @brief remplis la Pioche a partir d'un fichier.
* @param [in] const char * le nom du fichier
* @param [in-out] Pioche * pointeur sur Pioche .
*/
void remplirPioche(Pioche *, const char *);


#endif
